﻿# 设置CMake最低版本要求为3.4
cmake_minimum_required(VERSION 3.4)

# 定义项目名称为icar
project(icar)

# 设置C++标准为C++17
set(CMAKE_CXX_STANDARD 17)

# 设置编译器标志：-O3优化级别，-Wall显示所有警告，-pthread支持多线程
set(CMAKE_CXX_FLAGS "-O3 -Wall -pthread")

# 查找依赖库
# 查找PkgConfig工具，用于管理库的编译和链接标志
find_package(PkgConfig REQUIRED)
# 查找OpenCV计算机视觉库
find_package(OpenCV REQUIRED)

# 使用pkg-config查找GLib库（提供基础数据结构和实用函数）
pkg_search_module(GLIB REQUIRED glib-2.0)
# 使用pkg-config查找libserial库（用于串口通信）
pkg_search_module(SERIAL REQUIRED libserial)

# 包含目录设置
# 添加头文件搜索路径，让编译器能找到相关的头文件
include_directories(
    ${CMAKE_SOURCE_DIR}/include          # 项目主要头文件目录
    ${CMAKE_SOURCE_DIR}/utils/logger/inc # 日志库头文件目录
    ${OpenCV_INCLUDE_DIRS}               # OpenCV头文件目录
    ${GLIB_INCLUDE_DIRS}                 # GLib头文件目录
    ${SERIAL_INCLUDE_DIRS}               # 串口库头文件目录
)

# 链接目录设置
# 添加库文件搜索路径
link_directories(
    ${SERIAL_LIBRARY_DIRS}               # 串口库文件目录
)

# 日志库源文件收集
# 自动收集utils/logger/src目录下的所有源文件
aux_source_directory(utils/logger/src LOGGER_SOURCES)

# 创建静态库
# 将日志相关源文件编译成静态库
add_library(logger_lib STATIC ${LOGGER_SOURCES})

# 核心功能模块库
# 创建图像捕获功能静态库
add_library(capture STATIC include/capture.cpp)
# 创建图像显示功能静态库
add_library(display STATIC include/display.cpp)

# 主程序可执行文件
# 编译主程序，生成可执行文件
add_executable(icar src/main.cpp)

# 链接库设置
# 将所有需要的库链接到主程序
target_link_libraries(icar
    capture                              # 图像捕获库
    display                              # 图像显示库
    logger_lib                           # 日志库
    ${OpenCV_LIBS}                       # OpenCV库
    ${GLIB_LIBRARIES}                    # GLib库
    ${SERIAL_LIBRARIES}                  # 串口通信库
    pthread                              # POSIX线程库
)
